
#include "instructions/constants/const.h"

namespace jvm {
namespace instructions {

// Push null
void ACONST_NULL::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushRef(nullptr);
}


// Push double
void DCONST_0::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushDouble(0.0);
}

void DCONST_1::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushDouble(1.0);
}


// Push float
void FCONST_0::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushFloat(0.0f);
}

void FCONST_1::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushFloat(1.0f);
}

void FCONST_2::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushFloat(2.0f);
}

// Push int constant
void ICONST_M1::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(-1);
}

void ICONST_0::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(0);
}

void ICONST_1::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(1);
}

void ICONST_2::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(2);
}

void ICONST_3::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(3);
}

void ICONST_4::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(4);
}

void ICONST_5::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushInt(5);
}

// Push long constant
void LCONST_0::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushLong(0);
}

void LCONST_1::execute(std::shared_ptr<rtda::Frame> p_frame)  {
    p_frame->getOperandStack()->pushLong(1);
}

} // namespace instructions
} // namespace jvm
